package com.pattern1.visitor;

/**
 * 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。
 * 一旦这些操作需要修改的话，接受这个操作的数据结构就可以保持不变。
 * 为不同类型的元素提供多种访问操作方式，且可以在不修改原有系统的情况下增加新的操作方式，这就是访问者模式的模式动机。
 *
 * 考虑这样一个应用：已知三点坐标，编写功能类，求所围三角形的面积和周长。
 *
 * 如果采用访问者模式架构，应当这样思考：目前已确定的需求分析是求面积和周长功能，
 * 但有可能将来求三角形的重心、垂心坐标，内切、外接圆的半径等，因此，在设计时必须考虑如何屏蔽这些不确定的情况。
 * 具体代码如下所示。
 */

public interface IShape {
    float getArea(); // 已明确的需求

    float getLength(); // 已明确的需求

    // 可扩展的需求分析
    // 为了屏蔽返回值差异，所以把返回值定义成Object,表明可以返回任意对象类型。
    Object accept(IVisitor visitor);
}
